package com.qsl.system.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.qsl.common.util.RouterHelper;
import com.qsl.model.system.SysMenu;
import com.qsl.model.system.SysRoleMenu;
import com.qsl.model.vo.AssginMenuVo;
import com.qsl.model.vo.RouterVo;
import com.qsl.system.exception.BusinessException;
import com.qsl.system.mapper.SysMenuMapper;
import com.qsl.system.mapper.SysRoleMenuMapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.qsl.system.service.SysMenuService;
import com.qsl.system.utils.MenuHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 * 菜单表 服务实现类
 * </p>
 *
 * @author qsl
 * @since 2023-03-29
 */
@Service
public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> implements SysMenuService {

    @Autowired
    private SysMenuMapper sysMenuMapper;
    @Autowired
    private SysRoleMenuMapper sysRoleMenuMapper;

    // 查询菜单-树形
    @Override
    public List<SysMenu> findNodes() {
        // 获取所有菜单
        List<SysMenu> sysMenuList = sysMenuMapper.selectList(null);
        // 所有菜单数据转换为多层次数据（构建树形数据）
        List<SysMenu> resultList = MenuHelper.bulidTree(sysMenuList);
        return resultList;
    }

    /**
     * 根据id删除-判断下层是否有数据
     *
     * @param id
     */
    @Override
    public void removeMenuById(String id) {
        // 查询当前菜单下面是否有子菜单
        QueryWrapper<SysMenu> qw = new QueryWrapper<>();
        qw.eq("parent_id", id);
        Integer count = sysMenuMapper.selectCount(qw);
        System.out.println("===> count" + count);
        if (count == 0) {
            sysMenuMapper.deleteById(id);
        } else {
            // 抛出自定义异常
            throw new BusinessException(201, "当前菜单正在使用不允许删除");
        }
    }

    // 根据角色分配菜单
    @Override
    public List<SysMenu> findSysMenuByRoleId(String roleId) {
        // 获取所有状态为1（正常）的菜单/权限
        QueryWrapper<SysMenu> qw = new QueryWrapper<SysMenu>();
        qw.eq("status", 1);
        List<SysMenu> menuList = sysMenuMapper.selectList(qw);

        // 根据角色id查询 ，角色分配所有菜单id
        QueryWrapper<SysRoleMenu> qwRoleMenu = new QueryWrapper<>();
        qwRoleMenu.eq("role_id", roleId);
        List<SysRoleMenu> roleMenus = sysRoleMenuMapper.selectList(qwRoleMenu);
        // 获取该角色已分配的所有权限id
        ArrayList<String> roleMenuIds = new ArrayList<>();
        for (SysRoleMenu roleMenu : roleMenus) {
            roleMenuIds.add(roleMenu.getMenuId());
        }
        // 遍历所有权限列表
        for (SysMenu sysMenu : menuList) {
            // 判断 分配菜单id和所有菜单是否相等。  相等：isSelect为true
            if (roleMenuIds.contains(sysMenu.getId())) {
                sysMenu.setSelect(true);
            } else {
                sysMenu.setSelect(false);
            }
        }

        // 数据转换为树形结构
        List<SysMenu> sysMenuList = MenuHelper.bulidTree(menuList);
        return sysMenuList;
    }

    // 给角色分配权限
    @Override
    public void doAssign(AssginMenuVo assginMenuVo) {
        // 删除已分配的权限
        QueryWrapper<SysRoleMenu> qwRoleMenu = new QueryWrapper<>();
        qwRoleMenu.eq("role_id", assginMenuVo.getRoleId());
        sysRoleMenuMapper.delete(qwRoleMenu);

        // 遍历所有已选择的权限id
        for (String menuId : assginMenuVo.getMenuIdList()) {
            if (menuId != null) {
                // 创建SysRoleMenu对象
                SysRoleMenu sysRoleMenu = new SysRoleMenu();
                sysRoleMenu.setMenuId(menuId);
                sysRoleMenu.setRoleId(assginMenuVo.getRoleId());
                // 添加新权限
                sysRoleMenuMapper.insert(sysRoleMenu);
            }
        }
    }

    // 根据userId查询菜单权限值
    @Override
    public List<RouterVo> getUserMenuList(String userId) {
        // 判断是否是超级管理员， admin是超级管理员
        List<SysMenu> sysMenuList = null;
        // userId=1超级管理员，否则是其他用户
        if ("1".equals(userId)) {
            QueryWrapper<SysMenu> qw = new QueryWrapper<>();
            qw.eq("status", 1);
            qw.orderByDesc("id");
            sysMenuList = sysMenuMapper.selectList(qw);
        } else {
            sysMenuList = sysMenuMapper.findMenuListUserId(userId);
        }

        // 构建数据为树形结构
        List<SysMenu> sysMenuTreeList = MenuHelper.bulidTree(sysMenuList);

        // 树形结构数据转换为前端路由树形结构数据
        List<RouterVo> routerVoList = RouterHelper.buildRouters(sysMenuTreeList);

        return routerVoList;
    }


    // 根据userId查询按钮权限值
    @Override
    public List<String> getUserButtonList(String userId) {
        // 判断是否是超级管理员， admin是超级管理员
        List<SysMenu> sysMenuList = null;
        if ("1".equals(userId)) { // userId=1超级管理员，否则是其他用户
            QueryWrapper<SysMenu> qw = new QueryWrapper<>();
            qw.eq("status", 1); // 状态(0:禁止,1:正常)
            sysMenuList = baseMapper.selectList(qw);
        } else {
            sysMenuList = baseMapper.findMenuListUserId(userId);
        }
        // 遍历并获取按钮
        List<String> permissionList = new ArrayList<>();
        for (SysMenu sysMenu : sysMenuList) {
            if (sysMenu.getType() == 2) {
                permissionList.add(sysMenu.getPerms());
            }
        }
        return permissionList;
    }
}
